<script>
  // 迭代器模式：它提供一个方法顺序的访问一个聚合对象中各个元素，而不是暴露该对象的内部表示
  // const foods = ['西兰花','芹菜','白菜']
  // // 遍历的是索引
  // for(let key in foods) {
  //   console.log('key',key)
  // }
  // // 遍历的是值
  // for(let food of foods){
  //   console.log('food',food)
  // }

  //  const foods = {
  //   name:'白菜',
  //   color:'green'
  //  }
  // // 遍历的是索引
  // for(let key in foods) {
  //   console.log('key',key)
  // }
  // // 遍历的是值 for of不能遍历对象
  // for(let food of foods){
  //   console.log('food',food)
  // }

//==================迭代协议=========================
// 迭代协议：它是一种约定，即只要遵循该协议，就可以使用for of遍历
// 1、可迭代协议：要求对象必须实现@@iterator方法，该方法返回一个迭代器[Symbol.iterator](){}
// 2、迭代器协议：要求迭代器必须实现next方法，该方法返回一个对象，包含done和value属性
//                                                           done:true表示已结束；done:false,value:xxx；表示可以继续迭代，其中的value就是遍历出来的值               
// 3、可迭代对象：可以被for of遍历的对象
// 4、迭代器对象：实现了迭代器协议的对象
let obj = {
  [Symbol.iterator](){
    // //第一种自己实现迭代器协议
    // let citys = ['北京','成都','深圳']
    // let index = 0
    // return {
    //   next() {
    //     if(index<citys.length) {
    //       return {done:false,value:citys[index++]}
    //     }
    //     return {done:true}
    //   }
    // }
    
    //第二种通过*gen函数实现
    function * gen() {
      yield '西兰花'
      yield '芹菜'
      yield '白菜'
    }
    return gen()
  }
}
for(let item of obj) {
  console.log(item)
}
</script>